package com.pt.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pt.dto.request.LoginRequest;
import com.pt.dto.request.RegisterRequest;
import com.pt.dto.request.UpdateProfileRequest;
import com.pt.dto.request.ChangePasswordRequest;
import com.pt.dto.request.UserSettingsRequest;
import com.pt.dto.response.AuthResponse;
import com.pt.dto.response.UserStatsResponse;
import com.pt.dto.response.UserProfileResponse;
import com.pt.dto.response.UserSettingsResponse;
import com.pt.entity.User;
import com.pt.entity.UserBonusLog;
import com.pt.entity.Invitation;

import java.util.List;
import java.util.Map;

public interface UserService extends IService<User> {
    AuthResponse register(RegisterRequest request);
    
    /**
     * 注册用户（不返回token，需要邮箱验证）
     */
    void registerUser(RegisterRequest request);
    
    /**
     * 用户登录
     */
    User login(String username, String password);
    
    User getCurrentUser();
    
    /**
     * 获取当前用户个人资料（包含passkey）
     */
    UserProfileResponse getCurrentUserProfile();
    
    void updateUserStats(Long userId, Long uploaded, Long downloaded);
    
    void updateBonusPoints(Long userId, Integer points);
    
    boolean isEligibleForDownload(Long userId, Long torrentId);
    
    String generatePasskey();
    
    boolean validatePasskey(String passkey);

    /**
     * 更新用户个人资料
     */
    User updateUserProfile(UpdateProfileRequest request);

    /**
     * 修改用户密码
     */
    void changeUserPassword(ChangePasswordRequest request);

    /**
     * 获取用户统计信息
     */
    UserStatsResponse getUserStats(Long userId);

    /**
     * 重新生成用户Passkey
     */
    String regeneratePasskey();
    
    /**
     * 获取邀请码列表
     */
    Page<Invitation> getInvitationList(int page, int size);
    
    /**
     * 删除邀请码
     */
    void deleteInvitationCode(Long invitationId);
    
    /**
     * 根据ID获取用户
     */
    User getUserById(Long userId);
    
    /**
     * 更新用户信息
     */
    void updateUser(User user);
    
    /**
     * 获取用户的下载权限限制（例如，每天可下载的种子数量）
     */
    Integer getDownloadLimit(Long userId);
    
    /**
     * 创建邀请码
     */
    Invitation createInvitationCode(Long userId);
    
    /**
     * 获取用户的魔力值变更记录
     */
    Page<UserBonusLog> getUserBonusLogs(Long userId, int page, int size);
    
    /**
     * 签到，获取魔力值
     */
    Integer checkIn(Long userId);
    
    /**
     * 更新用户警告次数
     */
    void updateWarningCount(Long userId, Integer warningCount);
    
    /**
     * 通过用户名获取用户
     */
    User getUserByUsername(String username);
    
    /**
     * 关键词搜索用户
     */
    Page<User> listUsersByKeyword(String keyword, int page, int size);
    
    /**
     * 更新用户等级
     */
    void updateUserClass(Long userId, Integer userClass);
    
    /**
     * 更新用户状态
     */
    void updateUserStatus(Long userId, Integer status);
    
    /**
     * 获取站点概览统计
     */
    Map<String, Object> getSiteOverview();
    
    /**
     * 获取每日流量统计
     */
    Map<String, Object> getDailyTrafficStats(int days);
    
    /**
     * 获取每日流量统计（支持日期范围）
     */
    Map<String, Object> getDailyTrafficStats(int days, String startDate, String endDate);
    
    /**
     * 获取活跃用户统计
     */
    Map<String, Object> getActiveUserStats(int days);
    
    /**
     * 获取活跃用户统计（支持日期范围）
     */
    Map<String, Object> getActiveUserStats(int days, String startDate, String endDate);
    
    /**
     * 获取用户个人资料（用于展示给其他用户查看）
     */
    UserProfileResponse getUserProfile(Long userId, Long viewerId);
    
    /**
     * 获取用户设置
     */
    UserSettingsResponse getUserSettings();
    
    /**
     * 保存用户设置
     */
    void saveUserSettings(UserSettingsRequest request);
    
    /**
     * 检查并更新用户考核状态
     */
    Map<String, Object> checkUserAssessment(Long userId);
    
    /**
     * 批量检查所有考核期用户
     */
    List<Map<String, Object>> batchCheckAssessments();
    
    /**
     * 为用户设置考核期
     */
    void setUserAssessment(Long userId, Integer assessmentDays);
    
    /**
     * 取消用户考核，恢复正常状态
     */
    void cancelUserAssessment(Long userId);
    
    /**
     * 记录用户下载种子，更新缓存
     */
    void recordDownload(Long userId, Long torrentId);
    
    void updateLastLogin(Long userId);
    
    boolean checkDownloadLimit(Long userId);
    
    void incrementDailyDownloadCount(Long userId);
    
    Integer getDailyDownloadCount(Long userId);

    /**
     * 更新用户的管理员身份
     * @param userId 用户ID
     * @param isAdmin 是否设置为管理员
     */
    void updateUserAdminStatus(Long userId, Boolean isAdmin);

    /**
     * 根据passkey获取用户
     */
    User getByPasskey(String passkey);
} 